﻿// 麻省理工学院许可证
//
// 版权所有  缄默    联系方式：pengyouak@163.com
//
// 特此免费授予获得本软件的任何人以处理本软件的权利，但须遵守以下条件：在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供，不提供任何形式的明示或暗示的保证，包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下，作者或版权持有人均不对任何索赔、损害或其他责任负责，无论是因合同、侵权或其他方式引起的，与软件或其使用或其他交易有关。

using System;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;

namespace HighReportRegester
{
    internal class DESHelper
    {
        #region DES加密

        public static string DesEncrypt(string str, string key, string IV) => DesEncrypt(str, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(IV));

        /// <summary>
        /// 加密字符串
        /// </summary>
        /// <param name="sInputString">输入字符</param>
        /// <param name="sKey">Key(8位长度字符串)</param>
        /// <param name="IV">偏移向量(8位长度字符串)</param>
        /// <returns>加密结果</returns>
        public static string DesEncrypt(string str, byte[] key, byte[] IV)
        {
            byte[] data = Encoding.UTF8.GetBytes(str);
            byte[] result;
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = (key);
            DES.IV = (IV);
            ICryptoTransform desencrypt = DES.CreateEncryptor();
            result = desencrypt.TransformFinalBlock(data, 0, data.Length);
            return Convert.ToBase64String(result);
        }

        public static string DesDecrypt(string str, string key, string IV) => DesDecrypt(str, Encoding.UTF8.GetBytes(key), Encoding.UTF8.GetBytes(IV));

        /// <summary>
        /// 解密字符串
        /// </summary>
        /// <param name="sInputString">输入字符</param>
        /// <param name="sKey">Key(8位长度字符串)</param>
        /// <param name="IV">偏移向量(8位长度字符串)</param>
        /// <returns>解密结果</returns>
        public static string DesDecrypt(string str, byte[] key, byte[] IV)
        {
            try
            {
                if (!IsBase64String(str)) return str;
                byte[] data = Convert.FromBase64String(str);
                DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
                DES.Key = (key);
                DES.IV = (IV);
                ICryptoTransform desencrypt = DES.CreateDecryptor();
                byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
                return Encoding.UTF8.GetString(result);
            }
            catch
            {
                return str;
            }
        }

        public static bool IsBase64String(string s)
        {
            s = s.Trim();
            return (s.Length % 4 == 0) && Regex.IsMatch(s, @"^[a-zA-Z0-9\+/]*={0,3}$", RegexOptions.None);
        }

        #endregion DES加密
    }
}